package main

import "fmt"

//当defer被声明时，其参数就会被实时解析
func a() {
	i := 0
	defer fmt.Println(i) //输出0，因为i此时就是0
	i++
	defer fmt.Println(i) //输出1，因为i此时就是1
	return
}

//defer执行顺序为先进后出
// 结果:3 2 1 0
func b() {
	for i := 0; i < 4; i++ {
		defer fmt.Println(i)
	}
}

//defer是在return调用之后才执行的, 这里需要明确的是defer代码块的作用域仍然在函数之内，
// 结合上面的函数也就是说，defer的作用域仍然在c函数之内。因此defer仍然可以读取c函数内的变量
//当执行return 1 之后，i的值就是1. 此时此刻，defer代码块开始执行，对i进行自增操作。 因此输出2.

func c() (i int) {
	defer func() { i++ }()
	return 1
}

func main(){
	a()
	b()
	fmt.Println("C:",c())
}
